package cn.messageplus.core.test.client;

import cn.messageplus.core.test.MyRecord;

import javax.sound.sampled.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

/**
 * @author mo
 * @日期: 2024-12-09 21:51
 **/
public class Record {
    //定义录音格式
    static AudioFormat af = null;
    //定义目标数据行,可以从中读取音频数据,该 TargetDataLine 接口提供从目标数据行的缓冲区读取所捕获数据的方法。
    static TargetDataLine td = null;
    //定义源数据行,源数据行是可以写入数据的数据行。它充当其混频器的源。应用程序将音频字节写入源数据行，这样可处理字节缓冲并将它们传递给混频器。
    static SourceDataLine sd = null;
    //定义字节数组输入输出流
    static ByteArrayInputStream bais = null;
    static ByteArrayOutputStream baos = null;
    //定义音频输入流
    static AudioInputStream ais = null;
    //定义停止录音的标志，来控制录音线程的运行
    static Boolean stopflag = false;
    
    //设置AudioFormat的参数
    public static AudioFormat getAudioFormat() {
        //下面注释部分是另外一种音频格式，两者都可以
        AudioFormat.Encoding encoding = AudioFormat.Encoding.
                PCM_SIGNED;
        float rate = 8000f;
        int sampleSize = 16;
        String signedString = "signed";
        boolean bigEndian = true;
        int channels = 1;
        return new AudioFormat(encoding, rate, sampleSize, channels,
                (sampleSize / 8) * channels, rate, bigEndian);
//		//采样率是每秒播放和录制的样本数
//		float sampleRate = 16000.0F;
//		// 采样率8000,11025,16000,22050,44100
//		//sampleSizeInBits表示每个具有此格式的声音样本中的位数
//		int sampleSizeInBits = 16;
//		// 8,16
//		int channels = 1;
//		// 单声道为1，立体声为2
//		boolean signed = true;
//		// true,false
//		boolean bigEndian = true;
//		// true,false
//		return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed,bigEndian);
    }
    public static void main(String[] args) throws LineUnavailableException {
        //af为AudioFormat也就是音频格式
        af = getAudioFormat();
        DataLine.Info info = new DataLine.Info(TargetDataLine.class, af);
        td = (TargetDataLine) (AudioSystem.getLine(info));
        //打开具有指定格式的行，这样可使行获得所有所需的系统资源并变得可操作。
        td.open(af);
        //允许某一数据行执行数据 I/O
        td.start();
//        //创建播放录音的线程
//        MyRecord.Record record = new MyRecord.Record();
//        Thread t1 = new Thread(record);
//        t1.start();
//        stopflag = true;
    }
}
